//
// Created by denglibin on 19-10-5.
//
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

static int test_readdir(){
    char * dirName = "/home/denglibin/books";
    DIR * dir = opendir(dirName);
    if(dir == NULL){
        perror("opendir error:");
        return -1;
    }
    struct dirent *  sdp;
    while ((sdp = readdir(dir)) != NULL){ // 读取目录信息
        if(sdp->d_name[0] != '.'){
            printf("%s\n", sdp->d_name); // 目录下的文件（目录）
        }
    }
    closedir(dir); // 关闭
}

/**
 * 判断是否是目录
 */
static int isDir(char * filePath){
    struct stat sbuf;
    if((stat(filePath, &sbuf)) == -1){
        perror("stat:");
        return 0;
    }
    // 判断是否是目录
    if((sbuf.st_mode & S_IFMT) == S_IFDIR){
        return 1;
    }
    return 0;
}

/**
 * 递归遍历目录
 */
static void listDir(const char * dirName, int deep){
    DIR * dir = opendir(dirName);
    if(dir == NULL){
        perror("opendir error:");
        return;
    }
    struct dirent *  sdp;

    while ((sdp = readdir(dir)) != NULL){ // 读取目录信息
        if(sdp->d_name[0] != '.'){ // 隐藏目录

            for(int i = 0; i < deep; i++){
                printf("-");
            }
            printf("%s\n", sdp->d_name); // 目录下的文件（目录）
            char fileName[1024] = {0};

            sprintf(fileName, "%s/%s", dirName, sdp->d_name); // 拼接成完整的路径
            if(isDir(fileName)){
                listDir(fileName, deep+1);
            }
        }
    }
    closedir(dir); // 关闭
}


 static int main_(void){

    listDir("/home/denglibin/denglibin/learning_note", 0);
    return 0;
}